
package capa_logica;

import capa_persistencia.AccesoBD;
import capa_persistencia.CreadorBD;
import java.io.IOException; 
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.websocket.EncodeException;
import javax.websocket.Session;
        
public class Partida 
{
    public static int VEL_PILOTO = 2;
    public static int VIS_PILOTO = 141;
    public static int LARGO_PILOTO = 25;
    public static int ANCHO_PILOTO = 25;
    
    public static int VEL_TANQUE = 3;
    public static int VIS_TANQUE = 200;
    public static int LARGO_TANQUE = 100;
    public static int ANCHO_TANQUE = 50;
    
    public static int VEL_AVION = 35;
    public static int VIS_AVION = 0;
    public static int LARGO_AVION = 134;
    public static int ANCHO_AVION = 153;
    
    public static int VEL_BOMBA = VEL_AVION;
    public static int LARGO_BOMBA = 23;
    public static int ANCHO_BOMBA = 11;
    
    public static int VEL_DRONE = 4;
    public static int VIS_DRONE = 100;
    
    private int idPartida = -1;
    private Avion avion;

    
    private Escenario escenario;
    private Timer tiempo;
    private Piloto piloto;
    private Tanque tanque1;
    private Tanque tanque2;
    private Drone drone;
    public Session jugador1;
    public Session jugador2;
    
    public ContadorTiempoPartida temp;
    private int minutos = 5;
    private int segundos = 0;

    public Session getJugador1() {
        return jugador1;
    }

    public void setJugador1(Session jugador1) {
        this.jugador1 = jugador1;
    }

    public Session getJugador2() {
        return jugador2;
    }

    public void setJugador2(Session jugador2) {
        this.jugador2 = jugador2;
    }

    public Partida(Escenario escenario, Timer tiempo)
    {

        this.escenario = escenario;
        this.tiempo = tiempo;
        this.piloto = new Piloto(75, 36, 0, VIS_PILOTO, VEL_PILOTO, LARGO_PILOTO, ANCHO_PILOTO, 90, this.escenario);
        this.tanque1 = new Tanque(959, 350, 100, VIS_TANQUE, VEL_TANQUE, LARGO_TANQUE, ANCHO_TANQUE, 180, this.escenario);
        this.tanque2 = new Tanque(308, 468, 100, VIS_TANQUE, VEL_TANQUE, LARGO_TANQUE, ANCHO_TANQUE, 180, this.escenario);
        Random r = new Random();
        int pos = (r.nextInt(23));
        int posX;
        int posY;
        if(pos < 12)
        {
            posX = 52 + (pos * 104);
            posY = 50;
        }
        else
        {
            pos = pos - 12;
            posX = 52 + (pos * 104);
            posY = 650;
        }
        this.drone = new Drone(posX, posY, 0, VIS_DRONE, VEL_DRONE, 25, 25, 90, this.escenario);
        this.drone.setPiloto(this.piloto);
        this.drone.setTanque1(tanque1);
        this.drone.setTanque2(tanque2);
        this.avion=new Avion(300, 0, 0, VIS_AVION, VEL_AVION, LARGO_AVION, ANCHO_AVION, 90, this.escenario, tanque1, tanque2);
        
    }
    
    public void ocuparMatriz()
    {
        piloto.ocuparMatriz();
        tanque1.ocuparMatriz();
        tanque2.ocuparMatriz();
    }
    
    public int guardarPartida()
    {
        int numeroPartida = 0;
        try 
        {
            Properties p = new Properties();
            String nomArch = "datos.properties";
            InputStream in;
            in = CreadorBD.class.getResourceAsStream(nomArch);
            p.load(in);
            String url = p.getProperty("url");
            String user = p.getProperty("user");
            String pass = p.getProperty("pass");
            in.close();
            
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(url + "partidasguardadas", user, pass);
            AccesoBD a = new AccesoBD();
            
            numeroPartida = a.contarPartidas(con) + 1;
            this.idPartida = numeroPartida;
            a.insertarPartida(con, numeroPartida, escenario.getId(), minutos, segundos);
            int numeroActor = a.contarActores(con) + 1;
            a.insertarActor(con, numeroActor, piloto.getPosicionX(), piloto.getPosicionY(), piloto.getEnergia(), numeroPartida, piloto.getOrientacion());
            a.insertarPiloto(con, numeroActor, piloto.isLlamoDrone());
            a.insertarActor(con, numeroActor + 1, tanque1.getPosicionX(), tanque1.getPosicionY(), tanque1.getEnergia(), numeroPartida, tanque1.getOrientacion());
            a.insertarTanque(con, numeroActor + 1, tanque1.getDisparos());
            a.insertarActor(con, numeroActor + 2, tanque2.getPosicionX(), tanque2.getPosicionY(), tanque2.getEnergia(), numeroPartida, tanque2.getOrientacion());
            a.insertarTanque(con, numeroActor + 2, tanque2.getDisparos());
            a.insertarActor(con, numeroActor + 3, drone.getPosicionX(), drone.getPosicionY(), drone.getEnergia(), numeroPartida, drone.getOrientacion());
            a.insertarDrone(con, numeroActor + 3);
            a.insertarActor(con, numeroActor + 4, avion.getPosicionX(), avion.getPosicionY(), avion.getEnergia(), numeroPartida, avion.getOrientacion());
            a.insertarAvion(con, numeroActor + 4, avion.getBalas(), avion.getBombas());
            con.close();   
        } 
        catch (IOException | ClassNotFoundException | SQLException ex) 
        {
            Logger.getLogger(Escenario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return numeroPartida;
    }
    
    public boolean cargarPartida(int id)
    {
        boolean cargo = false;
        try 
        {
            Properties p = new Properties();
            String nomArch = "datos.properties";
            InputStream in;
            in = CreadorBD.class.getResourceAsStream(nomArch);
            p.load(in);
            String url = p.getProperty("url");
            String user = p.getProperty("user");
            String pass = p.getProperty("pass");
            in.close();
            
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(url + "partidasguardadas", user, pass);
            AccesoBD a = new AccesoBD();
            
            int seg = a.cargarTiempoPartida(con, id);
            Partida par = a.cargarPartida(con, id);
            par.idPartida = id;
            piloto = a.cargarPiloto(con, id, escenario);
            ArrayList<Tanque> tqs = new ArrayList<>();
            tqs = a.cargarTanque(con, id, escenario);
            tanque1 = tqs.get(0);
            tanque2 = tqs.get(1);
            avion = a.cargarAvion(con, id, escenario);
            avion.setTanque1(tanque1);
            avion.setTanque2(tanque2);
            drone = a.cargarDrone(con, id, escenario);
            drone.setPiloto(piloto);
            drone.setTanque1(tanque1);
            drone.setTanque2(tanque2);
            minutos = (seg / 60);
            segundos = (seg % 60);
            con.close();
            cargo = true;

        } 
        catch (IOException | ClassNotFoundException | SQLException ex) 
        {
            Logger.getLogger(Escenario.class.getName()).log(Level.SEVERE, null, ex);
            return cargo;
        }
        return cargo;
    }
    
     public JsonObject vistaRayosX()
     {
         System.out.println("LLEGUE A VISTARAYOSX EN PARTIDA");
        JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "vistaMatriz");
        
        JsonArrayBuilder jsonArray = Json.createArrayBuilder();
            
        Celda[][] mat = escenario.getMatriz();
        for(int i=0; i < 249; i++) 
        {
            for(int j = 0; j < 140; j++)
            {
                
                if(mat[i][j].getOcupante() != '0')
                {
                    JsonObjectBuilder job = Json.createObjectBuilder().add("ocupanteX", i);
                    job = job.add("ocupanteY", j);
                    jsonArray = jsonArray.add(job);
                }
            }
        }
            
        construirJson = construirJson.add("arreglo", jsonArray);
        JsonObject jsonJugador = construirJson.build();
        System.out.println("ME FUI DE VISTARAYOSX EN PARTIDA");
        return jsonJugador;
    }
    
    
    
    public JsonObject IluminarPiloto()
    {
        JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "iluminarPiloto");
        construirJson = construirJson.add("pilotoX", this.getPiloto().getPosicionX());
        construirJson = construirJson.add("pilotoY", this.getPiloto().getPosicionY());
        JsonObject jsonIluminarPiloto = construirJson.build();
        return jsonIluminarPiloto;
    }
    

     
    public JsonObject iluminarTanques()
    {
        JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "iluminarTanques");
        construirJson = construirJson.add("tanque1X", this.getTanque1().getPosicionX());
        construirJson = construirJson.add("tanque1Y", this.getTanque1().getPosicionY());
        construirJson = construirJson.add("tanque1CentroX", Utilidades.darCentroX(this.getTanque1().posicionX,this.getTanque1().getOrientacion()));
        construirJson = construirJson.add("tanque1CentroY", Utilidades.darCentroY(this.getTanque1().posicionY,this.getTanque1().getOrientacion()));
        construirJson = construirJson.add("tanque2CentroX", Utilidades.darCentroX(this.getTanque2().posicionX,this.getTanque2().getOrientacion()));
        construirJson = construirJson.add("tanque2CentroY", Utilidades.darCentroY(this.getTanque2().posicionY,this.getTanque2().getOrientacion()));
        construirJson = construirJson.add("tanque2X", this.getTanque2().getPosicionX());
        construirJson = construirJson.add("tanque2Y", this.getTanque2().getPosicionY());
        JsonObject jsonIluminarTanque = construirJson.build();
        return jsonIluminarTanque;
    }
     
public JsonObject cargarArboles()
     {

        JsonObjectBuilder construirJson1 = Json.createObjectBuilder().add("orden", "dibujarArboles"); 
        try 
        {
            Properties p = new Properties();
            String nomArch = "datos.properties";
            InputStream in;
            in = CreadorBD.class.getResourceAsStream(nomArch);
            p.load(in);
            String url = p.getProperty("url");
            String user = p.getProperty("user");
            String pass = p.getProperty("pass");
            in.close();
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(url + "partidasguardadas", user, pass);
            AccesoBD a = new AccesoBD();
            ArrayList<Obstaculo> obs = new ArrayList<>();
            obs = a.cargarObstaculos(con, escenario.getId());            

            JsonArrayBuilder jsonArray = Json.createArrayBuilder();
            
            for (int i=0; i < obs.size(); i++) 
            {
                if(obs.get(i).getCodOcupante() == 't')
                {
                    JsonObjectBuilder job = Json.createObjectBuilder().add("posX", obs.get(i).getPosicionX());
                    job = job.add("posY", obs.get(i).getPosicionY());
                    jsonArray = jsonArray.add(job);
                }
                
            }
            
            construirJson1 = construirJson1.add("arreglo", jsonArray);
        } 
        catch (IOException | ClassNotFoundException | SQLException ex) 
        {
            Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        JsonObject json1 = construirJson1.build();
        return json1;
     }

    public Coordenada romperObstaculo(int x, int y)
    {
        return escenario.destruirObstaculo(x, y);
    }

    // Getters and Setters 
    
    public Escenario getEscenario() {
        return escenario;
    }

    public void setEscenario(Escenario escenario) {
        this.escenario = escenario;
    }

    public Timer getTiempo() {
        return tiempo;
    }

    public void setTiempo(Timer tiempo) {
        this.tiempo = tiempo;
    }
    
    public void setDrone(Drone drone) {
        this.drone = drone;
    }

    public Drone getDrone() {
        return drone;
    }

    public Piloto getPiloto() {
        return piloto;
    }

    public void setPiloto(Piloto piloto) {
        this.piloto = piloto;
    }

    public Tanque getTanque1() {
        return tanque1;
    }

    public void setTanque1(Tanque tanque1) {
        this.tanque1 = tanque1;
    }

    public Tanque getTanque2() {
        return tanque2;
    }

    public void setTanque2(Tanque tanque2) {
        this.tanque2 = tanque2;
    }
    
    public Avion getAvion() {
        return avion;
    }

    public void setAvion(Avion avion) {
        this.avion = avion;
    }
    
    public int getIdPartida() {
        return idPartida;
    }
    
    
     public JsonObject dibujarEscenario(String jugador)
     {
     /*Pametro jugador : "jugador1" o "jugador2" */    
        JsonObjectBuilder construirJson1 = Json.createObjectBuilder().add("orden", "dibujarEscenario");
        construirJson1 = construirJson1.add("jugador",jugador);
        construirJson1 = construirJson1.add("pilotoX", this.getPiloto().getPosicionX());
        construirJson1 = construirJson1.add("pilotoY", this.getPiloto().getPosicionY());
        construirJson1 = construirJson1.add("orientacion", this.getPiloto().getOrientacion());
        construirJson1 = construirJson1.add("tanque1X", this.getTanque1().getPosicionX());
        construirJson1 = construirJson1.add("tanque1Y", this.getTanque1().getPosicionY());
        construirJson1 = construirJson1.add("orientacionT1", this.getTanque1().getOrientacion());
        construirJson1 = construirJson1.add("tanque2X", this.getTanque2().getPosicionX());
        construirJson1 = construirJson1.add("tanque2Y", this.getTanque2().getPosicionY());
        construirJson1 = construirJson1.add("orientacionT2", this.getTanque2().getOrientacion());
        construirJson1 = construirJson1.add("tanque1CentroX", Utilidades.darCentroX(this.getTanque1().posicionX,this.getTanque1().getOrientacion()));
        construirJson1 = construirJson1.add("tanque1CentroY", Utilidades.darCentroY(this.getTanque1().posicionY,this.getTanque1().getOrientacion()));
        construirJson1 = construirJson1.add("tanque2CentroX", Utilidades.darCentroX(this.getTanque2().posicionX,this.getTanque2().getOrientacion()));
        construirJson1 = construirJson1.add("tanque2CentroY", Utilidades.darCentroY(this.getTanque2().posicionY,this.getTanque2().getOrientacion()));
        construirJson1 = construirJson1.add("jugador1VeTanque1", pilotoVeTanqueN(1));
        construirJson1 = construirJson1.add("jugador1VeTanque2", pilotoVeTanqueN(2));
        construirJson1 = construirJson1.add("jugador2VePiloto", algunTanqueVeAlPiloto());            
        JsonObject jsonJugador1 = construirJson1.build();
        return jsonJugador1;       
     }

    public boolean puntoPerteneceACirculo(double x, double y, double r, double h, double k){
        /*  Ecuación del círculo (x - h)^2 + (y - k)^2 = r^2
            (x, y) centro del círculo. r radio. (h, k) punto a testear.
        */
         double ecuacion = Math.pow(x - h, 2) + Math.pow(y - k, 2);
         if (ecuacion <= Math.pow(r, 2)){
             return true;
         }
        return false;
    }
      
      public boolean pilotoVeTanqueN(int numeroTanque){
          double xCentroTanque = 0; 
          double yCentroTanque = 0;
          double xCentroPiloto = this.piloto.getPosicionX() + this.piloto.getAncho() / 2;
          double yCentroPiloto = this.piloto.getPosicionY() + this.piloto.getLargo() / 2;
          double radioTanque = 0; //Correctivo para la visibilidad.
          
          
          if (numeroTanque == 1){
              xCentroTanque = this.tanque1.getPosicionX() + this.tanque1.getAncho() / 2;
              yCentroTanque = this.tanque1.getPosicionY() + this.tanque1.getLargo() / 2;
              radioTanque = this.tanque1.getAncho() / 2;
          }
          else{
              xCentroTanque = this.tanque2.getPosicionX() + this.tanque2.getAncho() / 2;
              yCentroTanque = this.tanque2.getPosicionY() + this.tanque2.getLargo() / 2;
              radioTanque = this.tanque2.getAncho() / 2;
          }
          
         return puntoPerteneceACirculo(xCentroPiloto, yCentroPiloto, 
                            this.piloto.getVision() + radioTanque, 
                                        xCentroTanque, yCentroTanque);
           
      }
      
public int darCentroX(int posX, int orientacion)
    {
        if(orientacion == 0 || orientacion == 180)
        {
            return posX + 25;
        }
        else if(orientacion == 270 || orientacion == 90)
        {
            return posX + 50;
        }
        else
        {
            return posX + 56;
        }
    }
    public int darCentroY(int posY, int orientacion)
    {
        if(orientacion == 90 || orientacion == 270)
        {
            return posY + 25;
        }
        else if(orientacion == 0 || orientacion == 180)
        {
            return posY + 50;
        }
        else
        {
            return posY + 56;
        }
    }
      
public boolean algunTanqueVeAlPiloto()

      {
          int or1 = tanque1.getOrientacion();
          int or2 = tanque2.getOrientacion();
          int xCentroTanque1 = darCentroX(tanque1.getPosicionX(), or1);
          int yCentroTanque1 = darCentroY(tanque1.getPosicionY(), or1);
          int xCentroTanque2 = darCentroX(tanque2.getPosicionX(), or2);
          int yCentroTanque2 = darCentroY(tanque2.getPosicionY(), or2);     
          int xCentroPiloto = this.piloto.getPosicionX() + this.piloto.getAncho() / 2;
          int yCentroPiloto = this.piloto.getPosicionY() + this.piloto.getLargo() / 2;
          int radioPiloto = this.piloto.getLargo() / 2; //Correctivo para la visibilidad.          
          
          return
          (puntoPerteneceACirculo(xCentroTanque1, yCentroTanque1, 
                            this.tanque1.getVision() + radioPiloto, 
                                        xCentroPiloto, yCentroPiloto)) ||

          (puntoPerteneceACirculo(xCentroTanque2, yCentroTanque2, 
                            this.tanque2.getVision() + radioPiloto, 
                                        xCentroPiloto, yCentroPiloto));


      }
      public JsonObject moverPiloto(String tecla){

        this.getPiloto().moverPiloto(tecla);
        if (esAtrapadoPiloto()){
            MatarDrone();
            JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "finalizarJuego");
            construirJson = construirJson.add("jugadorGanador", "jugador2");
            JsonObject jsonJugador = construirJson.build();
            return jsonJugador;
        }
        JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "mover");
        construirJson = construirJson.add("jugador", "jugador1");
        construirJson = construirJson.add("pilotoX", this.getPiloto().getPosicionX());
        construirJson = construirJson.add("pilotoY", this.getPiloto().getPosicionY());
        construirJson = construirJson.add("orientacion", this.getPiloto().getOrientacion());
        construirJson = construirJson.add("jugador1VeTanque1", pilotoVeTanqueN(1));
        construirJson = construirJson.add("jugador1VeTanque2", pilotoVeTanqueN(2));
        construirJson = construirJson.add("jugador2VePiloto", algunTanqueVeAlPiloto());
        construirJson = construirJson.add("piederecho", this.getPiloto().isPieDerecho());
        JsonObject jsonJugador = construirJson.build();
        return jsonJugador;
    }
     public JsonObject moverTanque(String tecla, int numeroTanque){
            Tanque t = this.getTanque1();
            if (numeroTanque == 2){
                 t = this.getTanque2();
            }
            t.moverTanque(tecla);
            if (esAtrapadoPiloto()){
                MatarDrone();
                JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "finalizarJuego");
                construirJson = construirJson.add("jugadorGanador", "jugador2");
                JsonObject jsonJugador = construirJson.build();
                return jsonJugador;
            }
            JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "mover");
            construirJson = construirJson.add("jugador", "jugador2");
            construirJson = construirJson.add("tanque", numeroTanque);
            construirJson = construirJson.add("tanqueX", t.getPosicionX());
            construirJson = construirJson.add("tanqueY", t.getPosicionY());
            construirJson = construirJson.add("orientacionT1", t.getOrientacion());
            construirJson = construirJson.add("jugador1VeTanque1", pilotoVeTanqueN(1));
            construirJson = construirJson.add("jugador1VeTanque2", pilotoVeTanqueN(2));
            construirJson = construirJson.add("jugador2VePiloto", algunTanqueVeAlPiloto());
            JsonObject jsonJugador = construirJson.build();
            return jsonJugador;
     }      
   
public boolean esAtrapadoPiloto(){
         
         int or1 = tanque1.getOrientacion();
          int or2 = tanque2.getOrientacion();
          int xCentroTanque1 = darCentroX(tanque1.getPosicionX(), or1);
          double yCentroTanque1 = this.tanque1.getPosicionY() + this.tanque1.getLargo() / 2;
          double xCentroTanque2 = this.tanque2.getPosicionX() + this.tanque2.getAncho() / 2;
          double yCentroTanque2 = this.tanque2.getPosicionY() + this.tanque2.getLargo() / 2;          
          double xCentroPiloto = this.piloto.getPosicionX() + this.piloto.getAncho() / 2;
          double yCentroPiloto = this.piloto.getPosicionY() + this.piloto.getLargo() / 2;
          double radioPiloto = this.piloto.getLargo() / 2; //Correctivo para la visibilidad.          
          
          return
          (puntoPerteneceACirculo(xCentroTanque1, yCentroTanque1, 
                            (this.tanque1.getVision() + radioPiloto) / 3  , 
                                        xCentroPiloto, yCentroPiloto))
                  ||
          (puntoPerteneceACirculo(xCentroTanque2, yCentroTanque2, 
                            (this.tanque2.getVision() + radioPiloto) / 3, 
                                        xCentroPiloto, yCentroPiloto));
     } 
 public JsonObject JsonDibujarVistaLateral(int x, int y)
    {
        JsonObjectBuilder buildJson = Json.createObjectBuilder().add("orden", "vistaLateral");
        buildJson = buildJson.add("tanque1X", tanque1.posicionX);
        buildJson = buildJson.add("orientacionT1", tanque1.orientacion);
        buildJson = buildJson.add("tanque1CentroY", Utilidades.darCentroY(tanque1.posicionY,tanque1.orientacion));
        buildJson = buildJson.add("tanque2X", tanque2.posicionX);
        buildJson = buildJson.add("orientacionT2", tanque2.orientacion);
        buildJson = buildJson.add("tanque2CentroY", Utilidades.darCentroY(tanque2.posicionY,tanque2.orientacion));
        buildJson = buildJson.add("clickDerechoX", x);
        buildJson = buildJson.add("clickDerechoY", y);
        if(this.getTanque1().getOrientacion() < 180)
        {
            buildJson = buildJson.add("orientacionT1", 90);
        }
        else
        {
            buildJson = buildJson.add("orientacionT1", 270);
        }
        if(this.getTanque2().getOrientacion() < 180)
        {
            buildJson = buildJson.add("orientacionT2", 90);
        }
        else
        {
            buildJson = buildJson.add("orientacionT2", 270);
        }
        JsonObject value = buildJson.build();
        return value;
    }
    
    public JsonObject JsonMoverTanqueLateral(String tecla, int tanq)
    {
        JsonObjectBuilder buildJson = Json.createObjectBuilder().add("orden", "moverTanqueLateral");
        if(tanq == 1)
        {
            if((this.getTanque1().getOrientacion() == 0) && (tecla != "der") && (tecla != "izq"))
            {
                this.getTanque1().rotarTanqueHorario();
                this.getTanque1().moverTanque(tecla);
                this.getTanque1().rotarTanqueAntiHorario();
            }
            if((this.getTanque1().getOrientacion() == 180) && (tecla != "der") && (tecla != "izq"))
            {
                this.getTanque1().rotarTanqueAntiHorario();
                this.getTanque1().moverTanque(tecla);
                this.getTanque1().rotarTanqueHorario();
            }
            buildJson = buildJson.add("queTanque", "tanque1VistaLateral");
            buildJson = buildJson.add("tanqueX", this.getTanque1().getPosicionX());
            if(this.getTanque1().getOrientacion() < 180)
            {
                buildJson = buildJson.add("orientacionT", 90);
            }
            else
            {
                buildJson = buildJson.add("orientacionT", 270);
            }
        }
        else
        {
            if((this.getTanque2().getOrientacion() == 0) && (tecla != "der") && (tecla != "izq"))
            {
                this.getTanque2().rotarTanqueHorario();
                this.getTanque2().moverTanque("arriba");
                this.getTanque2().rotarTanqueAntiHorario();
            }
            if((this.getTanque2().getOrientacion()) == 180 && (tecla != "der") && (tecla != "izq"))
            {
                this.getTanque2().rotarTanqueAntiHorario();
                this.getTanque2().moverTanque("arriba");
                this.getTanque2().rotarTanqueHorario();
            }
            buildJson = buildJson.add("queTanque", "tanque2VistaLateral");
            buildJson = buildJson.add("tanqueX", this.getTanque2().getPosicionX());
            if(this.getTanque2().getOrientacion() < 180)
            {
                buildJson = buildJson.add("orientacionT", 90);
            }
            else
            {
                buildJson = buildJson.add("orientacionT", 270);
            }
        }

        JsonObject value = buildJson.build();
        return value;
    }

    public int getMinutos() 
    {
        return minutos;
    }

    public void setMinutos(int minutos) {
        this.minutos = minutos;
    }

    public int getSegundos() {
        return segundos;
    }

    public void setSegundos(int segundos) {
        this.segundos = segundos;
    }
    
    public void comenzarReloj(int min, int seg)
    {
        Timer temporizador = new Timer("");
        this.temp = new ContadorTiempoPartida();
        temp.jugador1 = this.jugador1;
        temp.jugador2 = this.jugador2;
        temp.d = this.drone;
        temp.minutos = min;
        temp.segundos = seg;
        this.temp.enPausa = false;
        temporizador.schedule(temp, 1000, 1000);
        
    }
      
    public void comenzarReloj()
    {
        Timer temporizador = new Timer("");
        this.temp = new ContadorTiempoPartida();
        temp.jugador1 = this.jugador1;
        temp.jugador2 = this.jugador2;
        temp.d = this.drone;
        temp.minutos = this.minutos;
        temp.segundos = this.segundos;
        this.temp.enPausa = false;
        temporizador.schedule(temp, 1000, 1000);
        
    }
    
    public void pausarReloj() throws InterruptedException{
        this.temp.enPausa = true;
        this.minutos = this.temp.minutos;
        this.segundos = this.temp.segundos;
        this.temp.cancel();
    }

    public boolean partidaPausada(){
        return this.temp.enPausa;
    }

     public void MatarDrone()
     {
         if (this.drone != null)
            this.drone.matoDrone();
     }
    
    public class ContadorTiempoPartida extends TimerTask 
    {
        //Las veces que se debe repetir el código
        private int veces = 360;
        private Session jugador1;
        private Session jugador2;
        private int minutos = 0;
        private int segundos = 0;
        private Drone d;
        private boolean enPausa = false;



        public void run() 
        {
            //contadorVeces++;
            
            if(segundos > 0){
                segundos--;
 
            }
            else if (segundos == 0){
                if (minutos == 0){
                    //Se acabó el tiempo.
                    this.d.matoDrone();
                    JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "finalizarJuego");
                    construirJson = construirJson.add("jugadorGanador", "empate");
                    JsonObject jsonJugador = construirJson.build();
                    if (jugador1.isOpen()){
                        try {
                            jugador1.getBasicRemote().sendObject(jsonJugador);
                        } catch (IOException ex) {
                            Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (EncodeException ex) {
                            Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        
                    }
                    if (jugador2.isOpen()){
                        try {
                            jugador2.getBasicRemote().sendObject(jsonJugador);
                        } catch (IOException ex) {
                            Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (EncodeException ex) {
                            Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    this.cancel();
                }
                else{
                    minutos--;
                    segundos = 59;
                }
            }
            JsonObjectBuilder construirJson = Json.createObjectBuilder().add("orden", "temporizador");
            construirJson = construirJson.add("minutos", minutos);
            construirJson = construirJson.add("segundos", segundos);
            JsonObject jsonJugador = construirJson.build();
            if (jugador1.isOpen()){
                try {
                    jugador1.getBasicRemote().sendObject(jsonJugador);
                } catch (IOException ex) {
                    Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                } catch (EncodeException ex) {
                    Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (jugador2.isOpen()){
                try {  
                    jugador2.getBasicRemote().sendObject(jsonJugador);
                } catch (IOException ex) {
                    Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                } catch (EncodeException ex) {
                    Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            
        }
    }        
}
